package co.com.smart.eagle.server.servicehandler.login;

import java.util.List;

import co.com.smart.eagle.client.ParametroHandler;
import co.com.smart.eagle.client.rpcservices.login.LoginService;
import co.com.smart.eagle.infrastructure.dto.AplicacionesDTO;
import co.com.smart.eagle.infrastructure.dto.RolesDTO;
import co.com.smart.eagle.infrastructure.dto.UsuariosDTO;
import co.com.smart.eagle.server.servicehandler.InvocationUtil;
import co.com.smart.eagle.server.servicehandler.InvocationUtil.Ejecutar;
import co.com.smart.eagle.session.DelegateContextEJB;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class LoginServiceImpl extends RemoteServiceServlet implements LoginService{

	/**
	 * 
	 */
	private static final long serialVersionUID = -2949869177012963920L;

	@Override
	public ParametroHandler<List<UsuariosDTO>> getUsuario() {
		return InvocationUtil.invocarMetodo(new Ejecutar<List<UsuariosDTO>>() {
			@Override
			public List<UsuariosDTO> getResultado() throws Exception {				
				return DelegateContextEJB.getUserBeanLocal().getUsers();
			}
			
		}, "Error invocando el servicio de usuarios");
	}

	@Override
	public ParametroHandler<Void> desconexion() {
		getThreadLocalRequest().getSession().invalidate();
		return new ParametroHandler<Void>();
	}

	@Override
	public ParametroHandler<List<RolesDTO>> getRoles() {
		return InvocationUtil.invocarMetodo(new Ejecutar<List<RolesDTO>>() {
			@Override
			public List<RolesDTO> getResultado() throws Exception {				
				return DelegateContextEJB.getRolBeanLocal().getRoles();
			}
			
		}, "Error invocando el servicio de roles");
	}

	@Override
	public ParametroHandler<Void> setUsuario(final UsuariosDTO user) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getUserBeanLocal().setUser(user);
				return null;
			}
			
		}, "Error invocando el servicio para guardar el usuario");
	}
	
	@Override
	public ParametroHandler<Void> borrarUsuario(final UsuariosDTO user) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getUserBeanLocal().deleteUser(user);
				return null;
			}
			
		}, "No es posible eliminar el registro, Dependencia de datos");
	}

	@Override
	public ParametroHandler<Void> setRol(final RolesDTO rol) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getRolBeanLocal().setRol(rol);
				return null;
			}
			
		}, "Error invocando el servicio para guardar el rol");
	}

	@Override
	public ParametroHandler<Void> borrarRol(final RolesDTO rol) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getRolBeanLocal().deleteRol(rol);
				return null;
			}
			
		}, "No es posible eliminar el registro, Dependencia de datos");
	}
	
	@Override
	public ParametroHandler<List<AplicacionesDTO>> getApplications() {
		return InvocationUtil.invocarMetodo(new Ejecutar<List<AplicacionesDTO>>() {
			@Override
			public List<AplicacionesDTO> getResultado() throws Exception {				
				return DelegateContextEJB.getApplicationBeanLocal().getApplications();
			}
			
		}, "Error invocando el servicio de aplicaciones");
	}

	@Override
	public ParametroHandler<Void> setApplication(final AplicacionesDTO app) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getApplicationBeanLocal().setApplication(app);
				return null;
			}
			
		}, "Error invocando el servicio para guardar la aplicaci\u00F3n");
	}

	@Override
	public ParametroHandler<Void> borrarApplication(final AplicacionesDTO app) {
		return InvocationUtil.invocarMetodo(new Ejecutar<Void>() {
			@Override
			public Void getResultado() throws Exception {	
				DelegateContextEJB.getApplicationBeanLocal().deleteApplication(app);
				return null;
			}
			
		}, "No es posible eliminar el registro, Dependencia de datos");
	}

}
